﻿Imports PTIC_Util
Imports PTIC_Util.GestionCalculs
Imports Actuariat
Imports OMANE.Common.Model.Parametrage

Namespace moteurTauxGaranti1
    ''' <summary>
    ''' Simulations du moteur 1
    ''' </summary>
    ''' <remarks></remarks>
    Public Class simulationsMoteur1
        Inherits CalculRacine
        Implements IsimulationsMoteur1

        Protected _moteur As IIntegMoteur_MethodeEqTarif
        Protected _radar As Dictionary(Of String, Double)

#Region "Constructeur"
        ''' <summary>
        ''' Constructeur
        ''' </summary>
        ''' <remarks></remarks>
        Friend Sub New(ByVal moteur As IIntegMoteur_MethodeEqTarif, ByVal etatCalcul As EtatCalcul)
            _moteur = moteur
            defaut()
        End Sub
        ''' <summary>
        ''' Constructeur
        ''' </summary>
        ''' <remarks></remarks>
        Public Sub New(ByVal moteur As IIntegMoteur_MethodeEqTarif)
            _moteur = moteur
            defaut()
        End Sub
        ''' <summary>
        ''' Ajout des simulations par défaut
        ''' </summary>
        ''' <remarks></remarks>
        Public Sub defaut() Implements IsimulationsMoteur1.defaut
            AjouteFonctionCalculIntermediaire(New simulationSensibiliteParametre(_moteur, nomTx_TechA, -0.02, 0.02, 0.004, 0.01))
            AjouteFonctionCalculIntermediaire(New simulationSensibiliteParametre(_moteur, nomDuree_Actu, -24, 24, 4, 12))
            AjouteFonctionCalculIntermediaire(New simulationSensibiliteParametre(_moteur, nomTxNom_Actu, -0.02, 0.02, 0.004, 0.01))
            AjouteFonctionCalculIntermediaire(New simulationSensibiliteParametre(_moteur, nomTx_CommiContA, -0.2, 0.2, 0.04, 0.01))
            AjouteFonctionCalculIntermediaire(New simulationSensibiliteParametre(_moteur, nomTx_fraiGestA, -0.05, 0.05, 0.01, 0.01))
            AjouteFonctionCalculIntermediaire(New simulationStressTestCSR(_moteur, "ST_Immo", -0.5, 0.5, 0.1, 0.1))
            AjouteFonctionCalculIntermediaire(New simulationStressTestTrAge(_moteur, "ST_Tr_age", -0.5, 0.5, 0.1, 0.1))
        End Sub
#End Region

#Region "Typage fort"
        ''' <summary>
        ''' Simulation sur le taux technique annuel
        ''' </summary>
        ''' <remarks></remarks>
        Public ReadOnly Property SimulTx_TechA() As simulationIndividuelle Implements IsimulationsMoteur1.SimulTx_TechA
            Get
                Return _lFonctionsCalculIntermediaires(0)
            End Get
        End Property

        ''' <summary>
        ''' Simulation sur les durées actuarielles
        ''' </summary>
        ''' <remarks></remarks>
        Public ReadOnly Property SimulDuree_Actu() As simulationIndividuelle Implements IsimulationsMoteur1.SimulDuree_Actu
            Get
                Return _lFonctionsCalculIntermediaires(1)
            End Get
        End Property

        ''' <summary>
        ''' Simulation sur les taux nominaux actuariels
        ''' </summary>
        ''' <remarks></remarks>
        Public ReadOnly Property SimulTxNom_Actu() As simulationIndividuelle Implements IsimulationsMoteur1.SimulTxNom_Actu
            Get
                Return _lFonctionsCalculIntermediaires(2)
            End Get
        End Property

        ''' <summary>
        ''' Simulation sur le taux de commissionnement actuariel
        ''' </summary>
        ''' <remarks></remarks>
        Public ReadOnly Property SimulTx_CommiContA() As simulationIndividuelle Implements IsimulationsMoteur1.SimulTx_CommiContA
            Get
                Return _lFonctionsCalculIntermediaires(3)
            End Get
        End Property

        ''' <summary>
        ''' Simulation sur les frais de gestion actuariels
        ''' </summary>
        ''' <remarks></remarks>
        Public ReadOnly Property SimulTx_fraiGestA() As simulationIndividuelle Implements IsimulationsMoteur1.SimulTx_fraiGestA
            Get
                Return _lFonctionsCalculIntermediaires(4)
            End Get
        End Property

        ''' <summary>
        ''' Simulation sur la répartition des prêts immobiliers
        ''' </summary>
        ''' <remarks></remarks>
        Public ReadOnly Property SimulST_Immo() As simulationIndividuelle Implements IsimulationsMoteur1.SimulST_Immo
            Get
                Return _lFonctionsCalculIntermediaires(5)
            End Get
        End Property

        ''' <summary>
        ''' Simulation sur la répartition de la tranche d'âge la plus âgée
        ''' </summary>
        ''' <remarks></remarks>
        Public ReadOnly Property SimulST_Tr_age() As simulationIndividuelle Implements IsimulationsMoteur1.SimulST_Tr_age
            Get
                Return _lFonctionsCalculIntermediaires(6)
            End Get
        End Property

        ''' <summary>
        ''' Simulation contenant le résumé des chocs réalisés au cours des autres simulations
        ''' </summary>
        ''' <remarks></remarks>
        Public ReadOnly Property SimulRadar() As Dictionary(Of String, Double) Implements IsimulationsMoteur1.SimulRadar
            Get
                Return _radar
            End Get
        End Property
#End Region

        ''' <summary>
        ''' Valeurs
        ''' </summary>
        ''' <remarks></remarks>
        Public ReadOnly Property Values As List(Of IFonctionCalcul) Implements IsimulationsMoteur1.Values
            Get
                Return ListeFonctionsCalculIntermediaires()
            End Get
        End Property

        ''' <summary>
        ''' Calculer
        ''' </summary>
        ''' <remarks></remarks>
        Public Overrides Sub Calculer(Optional ByVal ForcerCalcul As Boolean = False)

            Dim debut, fin As Double
            debut = Environment.TickCount
            _moteur.calculeInit()

            MyBase.Calculer()

            _moteur.calculeCloture()
            MAJradar()
            'Créer un tableau synthétique à l'aide de tous les résultats correspondant aux valeurs du radar
            fin = Environment.TickCount
            MsgBox("Temps en secondes : " & (fin - debut) / 1000)

        End Sub

        ''' <summary>
        ''' Invalider
        ''' </summary>
        ''' <remarks></remarks>
        Public Overrides Sub Invalider()
            MyBase.Invalider()
            For Each fonct As FonctionCalcul In _lFonctionsCalculIntermediaires
                If fonct.EtatCalcul = ValueEtatCalcul.A_JOUR Then
                    fonct.Invalider()
                End If
            Next
        End Sub

        ''' <summary>
        ''' Mise à jour du radar
        ''' </summary>
        ''' <remarks></remarks>
        Private Sub MAJradar()
            _radar = New Dictionary(Of String, Double)
            _radar.Clear()
            _radar.Add(nomTx_TechA, SimulTx_TechA.valeurRadar)
            _radar.Add(nomDuree_Actu, SimulDuree_Actu.valeurRadar)
            _radar.Add(nomTxNom_Actu, SimulTxNom_Actu.valeurRadar)
            _radar.Add(nomTx_CommiContA, SimulTx_CommiContA.valeurRadar)
            _radar.Add(nomTx_fraiGestA, SimulTx_fraiGestA.valeurRadar)
            _radar.Add("ST_Immo", SimulST_Immo.valeurRadar)
            _radar.Add("ST_Tr_age", SimulST_Tr_age.valeurRadar)
        End Sub

    End Class
End Namespace
